home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d18 / opbonus.arc / FLEXHDR.ARC / FLEXHDR.PAS next >
Pascal/Delphi Source File  |  1991-03-20  |  6KB  |  207 lines

  1. (*
  2.   Demonstrates how to derive a new header type from the existing HeaderNode
  3.   object. This unit provides a simple header type that uses FlexWrite instead
  4.   of FastWrite, so that headers can appear in more than one color. Headers can
  5.   be positioned at custom locations with InitCustom or at standard locations
  6.   (like top center, etc.) with Init.
  7.  
  8.   Written 3/9/90.
  9. *)
  10.  
  11. {$S-,R-,V-,I-,B-,F+,O+,A-}
  12.  
  13. {Conditional defines that may affect this unit}
  14. {$I OPDEFINE.INC}
  15.  
  16. unit FlexHdr;
  17.   {-Demonstrate how to add new header types for windows}
  18.  
  19. interface
  20.  
  21. uses
  22.   OpRoot,
  23.   OpString,
  24.   OpCrt,
  25.   {$IFDEF UseMouse}
  26.   OpMouse,
  27.   {$ENDIF}
  28.   OpFrame;
  29.  
  30. const
  31.   otFlexHeader = 2999;            {Stream code for FlexHeader}
  32.   veFlexHeader = 00;              {Stream version for FlexHeader}
  33.  
  34. type
  35.   FlexHeaderPtr  = ^FlexHeader;
  36.   FlexHeader     =
  37.     object(HeaderNode)
  38.       flColor : FlexAttrs;        {Flex attributes in color mode}
  39.       flMono : FlexAttrs;         {Flex attributes in mono mode}
  40.       flDummy : record end;       {Makes stream routines cleaner}
  41.       constructor Init(Name : String;
  42.                        var AttrColor, AttrMono : FlexAttrs;
  43.                        hType : HeaderPosType;
  44.                        FPtr : FramePtr);
  45.         {-Initialize a FlexHeader in a position relative to a frame}
  46.       constructor InitCustom(Name : String;
  47.                              var AttrColor, AttrMono : FlexAttrs;
  48.                              DX, DY : Integer;
  49.                              hPosn : FrameCharType);
  50.         {-Initialize header node}
  51.       procedure Draw(XL, YL, XH, YH : Byte; Framed : Boolean); virtual;
  52.         {-Draw one header node}
  53.       procedure Update(XL, YL, XH, YH : Byte; Framed : Boolean); virtual; {!!.01}
  54.         {-Adjust internal string and coords based on given frame coords}
  55.       procedure Coordinates(XL, YL, XH, YH : Byte;
  56.                             var heXL, heYL, heXH, heYH : Byte); virtual;
  57.         {-Return the absolute coordinates of a rectangle surrounding header}
  58.  
  59.       {... stream methods ...}
  60.       constructor Load(var S : IdStream);
  61.         {-Load from stream}
  62.       procedure Store(var S : IdStream);
  63.         {-Store to stream}
  64.     end;
  65.  
  66.   procedure FlexHeaderStream(SPtr : IdStreamPtr);
  67.     {-Register types needed for streams containing FlexHeaders}
  68.  
  69.   {======================================================================}
  70.  
  71. implementation
  72.  
  73.   constructor FlexHeader.Init(Name : String;
  74.                               var AttrColor, AttrMono : FlexAttrs;
  75.                               hType : HeaderPosType;
  76.                               FPtr : FramePtr);
  77.     {-Initialize a FlexHeader in a position relative to a frame}
  78.   begin
  79.     if hType = heSpan then
  80.       {Spans not allowed here}
  81.       Fail;
  82.     flColor := AttrColor;
  83.     flMono := AttrMono;
  84.     if not HeaderNode.Init(Name, AttrColor[0], AttrMono[0],
  85.                            0, 0, hType, frTL) then
  86.       Fail;
  87.     with FPtr^ do
  88.       Update(frXL, frYL, frXH, frYH, frFramed);
  89.   end;
  90.  
  91.   constructor FlexHeader.InitCustom(Name : String;
  92.                                     var AttrColor, AttrMono : FlexAttrs;
  93.                                     DX, DY : Integer;
  94.                                     hPosn : FrameCharType);
  95.     {-Initialize header node}
  96.   begin
  97.     flColor := AttrColor;
  98.     flMono := AttrMono;
  99.     if not HeaderNode.Init(Name, AttrColor[0], AttrMono[0],
  100.                            DX, DY, heCustom, hPosn) then
  101.       Fail;
  102.   end;
  103.  
  104.   procedure FlexHeader.Update(XL, YL, XH, YH : Byte; Framed : Boolean);
  105.     {-Adjust internal string and coords based on given frame coords}
  106.   var
  107.     SaveLen : Byte;
  108.   begin
  109.     SaveLen := Byte(heName^[0]);
  110.     Byte(heName^[0]) := FlexLen(heName^);
  111.     HeaderNode.Update(XL, YL, XH, YH, Framed);
  112.     Byte(heName^[0]) := SaveLen;
  113.   end;
  114.  
  115.   procedure FlexHeader.Draw(XL, YL, XH, YH : Byte; Framed : Boolean);
  116.     {-Draw one header node}
  117.   var
  118.     X : Integer;
  119.     Y : Integer;
  120.     {$IFDEF UseMouse}
  121.     MOn : Boolean;
  122.     {$ENDIF}
  123.   begin
  124.     if Disabled then
  125.       Exit;
  126.     case hePosn of
  127.       frTL, frTT, frBB, frLL, frRR :
  128.         begin
  129.           X := XL; Y := YL;
  130.         end;
  131.       frBL :
  132.         begin
  133.           X := XL; Y := YH;
  134.         end;
  135.       frTR :
  136.         begin
  137.           X := XH; Y := YL;
  138.         end;
  139.       frBR :
  140.         begin
  141.           X := XH; Y := YH;
  142.         end;
  143.     end;
  144.     inc(Y, heDY);
  145.     inc(X, heDX);
  146.     if (Y < 1) or (X < 1) then
  147.       Exit;
  148.  
  149.     {$IFDEF UseMouse}
  150.     HideMousePrim(MOn);
  151.     {$ENDIF}
  152.  
  153.     {No clipping support}
  154.     if UseColor then
  155.       FlexWrite(heName^, Y, X, flColor)
  156.     else
  157.       FlexWrite(heName^, Y, X, flMono);
  158.  
  159.     {$IFDEF UseMouse}
  160.     ShowMousePrim(MOn);
  161.     {$ENDIF}
  162.   end;
  163.  
  164.   procedure FlexHeader.Coordinates(XL, YL, XH, YH : Byte;
  165.                                    var heXL, heYL, heXH, heYH : Byte);
  166.     {-Return the absolute coordinates of a rectangle surrounding header}
  167.   var
  168.     SaveLen : Byte;
  169.   begin
  170.     SaveLen := Byte(heName^[0]);
  171.     Byte(heName^[0]) := FlexLen(heName^);
  172.     HeaderNode.Coordinates(XL, YL, XH, YH, heXL, heYL, heXH, heYH);
  173.     Byte(heName^[0]) := SaveLen;
  174.   end;
  175.  
  176.   constructor FlexHeader.Load(var S : IdStream);
  177.     {-Load from stream}
  178.   begin
  179.     if not HeaderNode.Load(S) then
  180.       Fail;
  181.     S.ReadRange(flColor, flDummy);
  182.     if S.PeekStatus <> 0 then begin
  183.       Done;
  184.       Fail;
  185.     end;
  186.   end;
  187.  
  188.   procedure FlexHeader.Store(var S : IdStream);
  189.     {-Store to stream}
  190.   begin
  191.     HeaderNode.Store(S);
  192.     S.WriteRange(flColor, flDummy);
  193.   end;
  194.  
  195.   procedure FlexHeaderStream(SPtr : IdStreamPtr);
  196.     {-Register types needed for streams containing FlexHeaders}
  197.   begin
  198.     DoubleListStream(SPtr);
  199.     with SPtr^ do begin
  200.       RegisterType(otHeaderNode, veHeaderNode,
  201.                    TypeOf(HeaderNode), @HeaderNode.Store, @HeaderNode.Load);
  202.       RegisterType(otFlexHeader, veFlexHeader,
  203.                    TypeOf(FlexHeader), @FlexHeader.Store, @FlexHeader.Load);
  204.     end;
  205.   end;
  206. end.
  207.